﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using Badge_Manager.View;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.Controlli
{
    public partial class ctrlWizard2 : UserControl
    {
        #region "Proprietà Pubbliche"

        //public List<DettaglioAttivita> DettagliAttivitaRitorno;

        #endregion "Proprietà Pubbliche"

        public enum Risultato
        {
            BuonFine,
            Errore,
            CampiNonValidi
        }

        private Utente User;
        //public Attivita Attivita;
        private DataTable data = null;
        private StatoForm status;
        private ctrlAttivitaDettaglio ctrlDettagliAttivita;
        private ctrlAttivita ctrlAttivita;
        private bool chiudi;
        private List<DettaglioAttivita> dettagliAttivita;
        private frmElencoAttivita elenco;
        private frmWizard papa;
        public int numeroMinutiCalcolati;

        public ctrlWizard2()
        {
            InitializeComponent();
        }

        public void Inizalizza(frmWizard papa)
        {
            this.papa = papa;
            ctrlAttivita = new ctrlAttivita(papa.Attivita);
            GetRiepilogo();
            FormattaGriglia();
        }

        private void GetRiepilogo()
        {
            if (papa.Attivita == null)
                return;
            ctrlDettagliAttivita = new ctrlAttivitaDettaglio(papa.Attivita);
            dettagliAttivita = papa.Attivita.DettagliAttivita;
            txtCodiceCorso.Text = papa.Attivita.Corso.Codice;
            txtDescrizioneAttivita.Text = papa.Attivita.Descrizione;
            oreCorsoTextBox.Text = "" + papa.Attivita.Corso.NumeroOre;
        }

        private void FormattaGriglia()
        {
            data = new DataTable();
            data.Columns.Add("id", typeof(Guid));
            data.Columns.Add("Giorno", typeof(DateTime));
            data.Columns.Add("Orario inizio", typeof(DateTime));
            data.Columns.Add("Orario fine", typeof(DateTime));

            data.DefaultView.Sort = "Giorno";
            grid.DataSource = data;
            grid.Columns["Giorno"].DefaultCellStyle.Format = "dddd dd MMM yyyy";
            grid.Columns["Orario inizio"].DefaultCellStyle.Format = "HH:mm";
            grid.Columns["Orario fine"].DefaultCellStyle.Format = "HH:mm";
        }

        private void cmdModificaOrariSelezione_Click(object sender, EventArgs e)
        {
            if (grid.Rows.Count <= 0)
                return;
            if (!new ctrlAttivitaDettaglio(null)
                .ControllaConformitaOrari(daOraTimePicker.Value, daOraTimePicker.Value))
            {
                MessageBox.Show("Le ore non posso essere differenti nei minuti");
                return;
            }
            if (grid.Rows.Count == 0) { return; }
            // controlla se è stato modificato qualcosa, se no esci.
            if (((DateTime)grid.SelectedRows[0].Cells["Orario Inizio"].Value).Hour == (daOraTimePicker.Value).Hour &&
                ((DateTime)grid.SelectedRows[0].Cells["Orario Fine"].Value).Hour == (aOraTimePicker.Value).Hour &&
                ((DateTime)grid.SelectedRows[0].Cells["Orario Inizio"].Value).Minute == (daOraTimePicker.Value).Minute &&
                ((DateTime)grid.SelectedRows[0].Cells["Orario Fine"].Value).Minute == (aOraTimePicker.Value).Minute)
            {
                return;
            }

            ctrlDettagliAttivita.ModificaOrarioGiorno((Guid)grid.SelectedRows[0].Cells["id"].Value
                , daOraTimePicker.Value, aOraTimePicker.Value, chkCalcolaPausaPranzo.Checked, checkAutomatica.Checked);
            this.AggiornaGriglia();
            if (checkAutomatica.Checked && (papa.Attivita.Corso.NumeroOre - (numeroMinutiCalcolati / 60)) > 0)
            {
                // prende l'ultimo elemento
                DateTime ultimoElemento = new DateTime(
                ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Year,
                ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Month,
                ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Day,
                ((DateTime)data.Rows[data.Rows.Count - 1]["Orario Inizio"]).Hour,
                ((DateTime)data.Rows[data.Rows.Count - 1]["Orario Inizio"]).Minute,
                0);
                // Aggiunta di un singolo giorno con le ore rimanenti in coda alla lista e visualizzarla a video
                DateTime da = new DateTime(1, 1, 1, ultimoElemento.Hour, ultimoElemento.Minute, 0);
                DateTime a = new DateTime(1, 1, 1, ultimoElemento.Hour + BadgeManager.Properties.Settings.Default.DurataGiornataStandard, ultimoElemento.Minute, 0);
                // aggiunge un giorno in base all'ora di  inizio dell'ultimo giorno
                dettagliAttivita = ctrlDettagliAttivita.GeneraSingoloGiorno(ultimoElemento, da, a,
                    chkCalcolaPausaPranzo.Checked, (papa.Attivita.Corso.NumeroOre * 60) - numeroMinutiCalcolati);
                this.AggiornaGriglia();
            }
            SelezionaRiga(grid.Rows.Count - 1);
        }

        private void AggiornaGriglia()
        {
            data.Rows.Clear();
            int giorniConPranzo = 0;
            numeroMinutiCalcolati = 0;
            for (int i = 0; i < papa.Attivita.DettagliAttivita.Count; i++)
            {
                DateTime dataora = new DateTime(
                    papa.Attivita.DettagliAttivita[i].Giorno.Date.Year,
                    papa.Attivita.DettagliAttivita[i].Giorno.Date.Month,
                    papa.Attivita.DettagliAttivita[i].Giorno.Date.Day,
                    papa.Attivita.DettagliAttivita[i].OraInizio,
                    papa.Attivita.DettagliAttivita[i].MinutiInizio,
                    0
                    );
                DateTime datadopo = new DateTime(
                    papa.Attivita.DettagliAttivita[i].Giorno.Date.Year,
                    papa.Attivita.DettagliAttivita[i].Giorno.Date.Month,
                    papa.Attivita.DettagliAttivita[i].Giorno.Date.Day,
                    papa.Attivita.DettagliAttivita[i].OraFine,
                    papa.Attivita.DettagliAttivita[i].MinutiFine,
                    0
                    );
                data.Rows.Add(
                    papa.Attivita.DettagliAttivita[i].Id,
                    papa.Attivita.DettagliAttivita[i].Giorno.Date,
                    dataora,
                    datadopo);
                TimeSpan OreDifferenza = (
                    new TimeSpan(papa.Attivita.DettagliAttivita[i].OraFine, papa.Attivita.DettagliAttivita[i].MinutiFine, 0)
                    -
                    new TimeSpan(papa.Attivita.DettagliAttivita[i].OraInizio, papa.Attivita.DettagliAttivita[i].MinutiInizio, 0)
                    );
                if ((chkCalcolaPausaPranzo.Checked) && (dataora.TimeOfDay < BadgeManager.Properties.Settings.Default.OrarioPausaPranzo
                    && datadopo.TimeOfDay > BadgeManager.Properties.Settings.Default.OrarioPausaPranzo))
                {
                    giorniConPranzo++;
                    numeroMinutiCalcolati += (int)OreDifferenza.TotalMinutes - BadgeManager.Properties.Settings.Default.durataPausaPranzo;
                }
                else
                {
                    numeroMinutiCalcolati += (int)OreDifferenza.TotalMinutes;
                }
            }
            grid.Columns["id"].Visible = false;

            lblOre.Text = "Totali " + ConvertiInOre(numeroMinutiCalcolati) +
                 " ed Pausa: " + ConvertiInOre(giorniConPranzo * BadgeManager.Properties.Settings.Default.durataPausaPranzo);

            grid.Columns["id"].Visible = false;
            lblOre.Text = "Totali " + ConvertiInOre(numeroMinutiCalcolati) +
                 " ed Pausa: " + ConvertiInOre(giorniConPranzo * BadgeManager.Properties.Settings.Default.durataPausaPranzo);
        }

        public string ConvertiInOre(int minuti)
        {
            int ore = minuti / 60;
            int min = minuti % 60;
            if (min == 0)
                return ore + " ore";
            else
                return ore + " ore e " + min + " minuti";
        }

        private void Genera()
        {
            data.Rows.Clear();

            dettagliAttivita = ctrlDettagliAttivita.GeneraElencoAttivitaDett
                (daOraTimePicker.Value, aOraTimePicker.Value, chkCalcolaPausaPranzo.Checked);
            AggiornaGriglia();
        }

        private void cmdGeneraElenco_Click(object sender, EventArgs e)
        {
            if (dettagliAttivita != null && dettagliAttivita.Count > 0)
            {
                DialogResult result = MessageBox.Show("Cancellare la Lista di Dettagli esistente per generarne una nuova a partire dalle ore "
                    + daOraTimePicker.Value.ToShortTimeString() + " alle ore " + aOraTimePicker.Value.ToShortTimeString() + " ? ",
                    "Informazione!", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (result == System.Windows.Forms.DialogResult.No)
                    return;
                dettagliAttivita.Clear();
            }
            this.Genera();
        }

        private void CancellaGiorno()
        {
            if (grid.SelectedRows.Count > 0)
            {
                ctrlDettagliAttivita.EliminaGiornoDettaglio
                    ((Guid)grid.SelectedRows[0].Cells[0].Value, chkCalcolaPausaPranzo.Checked, checkAutomatica.Checked,
                    ((papa.Attivita.Corso.NumeroOre * 60) - numeroMinutiCalcolati), daOraTimePicker.Value, aOraTimePicker.Value);
                this.AggiornaGriglia();
                if (checkAutomatica.Checked)
                {
                    DateTime ultimoElemento = new DateTime(
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Year,
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Month,
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Day,
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Orario Inizio"]).Hour,
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Orario Inizio"]).Minute,
                    0);
                    // Aggiunta di un singolo giorno con le ore rimanenti in coda alla lista e visualizzarla a video
                    DateTime da = new DateTime(1, 1, 1, ultimoElemento.Hour, ultimoElemento.Minute, 0);
                    DateTime a = new DateTime(1, 1, 1, ultimoElemento.Hour + BadgeManager.Properties.Settings.Default.DurataGiornataStandard, ultimoElemento.Minute, 0);
                    dettagliAttivita = ctrlDettagliAttivita.GeneraSingoloGiorno(ultimoElemento, da, a,
                        chkCalcolaPausaPranzo.Checked, (papa.Attivita.Corso.NumeroOre * 60) - numeroMinutiCalcolati);
                    this.AggiornaGriglia();
                }
            }
        }

        private void cmdCancella_Click(object sender, EventArgs e)
        {
            if (grid.SelectedRows.Count <= 0)
                return;
            int indiceSelezionato = grid.SelectedRows[0].Index;
            this.CancellaGiorno();
            SelezionaRiga(indiceSelezionato);
        }

        private void SelezionaRiga(int indiceSelezionato)
        {
            grid.ClearSelection();
            if (grid.Rows.Count > indiceSelezionato)
            {
                grid.Rows[indiceSelezionato].Selected = true;
                grid.FirstDisplayedScrollingRowIndex = indiceSelezionato;
            }
            else if (grid.Rows.Count == 0)
            {
                grid.ClearSelection();
            }
            else if (grid.Rows.Count == indiceSelezionato)
            {
                grid.Rows[indiceSelezionato - 1].Selected = true;
                grid.FirstDisplayedScrollingRowIndex = indiceSelezionato - 1;
            }
        }

        private void btnAggiungiGiorno_Click(object sender, EventArgs e)
        {
            this.GeneraGiorno();
            if (grid.Rows.Count > 0)
                SelezionaRiga(grid.Rows.Count - 1);
        }

        private void GeneraGiorno()
        {
            if (((papa.Attivita.Corso.NumeroOre * 60) - numeroMinutiCalcolati) <= 0)
                return;

            if (dettagliAttivita == null || dettagliAttivita.Count == 0)
            {
                dettagliAttivita = ctrlDettagliAttivita.GeneraSingoloGiorno(papa.Attivita.Corso.DataInizio, daOraTimePicker.Value, aOraTimePicker.Value,
                    chkCalcolaPausaPranzo.Checked, (((papa.Attivita.Corso.NumeroOre - numeroMinutiCalcolati) * 60)));
            }
            else
            {
                DateTime ultimoElemento = new DateTime(
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Year,
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Month,
                    ((DateTime)data.Rows[data.Rows.Count - 1]["Giorno"]).Day);
                // Aggiunta di un singolo giorno con le ore rimanenti in coda alla lista e visualizzarla a video
                dettagliAttivita = ctrlDettagliAttivita.GeneraSingoloGiorno(ultimoElemento, daOraTimePicker.Value, aOraTimePicker.Value,
                    chkCalcolaPausaPranzo.Checked, (papa.Attivita.Corso.NumeroOre * 60) - numeroMinutiCalcolati);
            }
            AggiornaGriglia();
        }

        public Risultato Memorizza(frmWizard papa)
        {
            if (dettagliAttivita.Count > 0)
            {
                papa.Attivita.DettagliAttivita = dettagliAttivita;
                return Risultato.BuonFine;
            }
            return Risultato.CampiNonValidi;
        }

        private void chkCalcolaPausaPranzo_CheckedChanged(object sender, EventArgs e)
        {
            Genera();
        }

        public bool Controlla()
        {
            if (numeroMinutiCalcolati > papa.Attivita.Corso.NumeroOre * 60)
            {
                MessageBox.Show("Il Numero di Ore dell'Attività supera di "
                    + ConvertiInOre(numeroMinutiCalcolati - (papa.Attivita.Corso.NumeroOre * 60))
                    + " ora/e il totale previsto.\n Modificare e poi salvare");
                return false;
            }
            else if (numeroMinutiCalcolati < papa.Attivita.Corso.NumeroOre * 60)
            {
                MessageBox.Show("Il Numero di Ore dell'Attività non è uguale alle alle ore previste. Mancano: "
                    + ConvertiInOre((papa.Attivita.Corso.NumeroOre) * 60 - numeroMinutiCalcolati)
                    + " ora/e dal totale previsto.\n Modificare e poi salvare");
                return false;
            }
            return true;
        }
    }
}